#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int QDataType;
typedef struct QListNode
{
	struct QListNode* next;
	QDataType data;
}QNode;
typedef struct Queue
{
	QNode* front;
	QNode* rear;
}Queue;
typedef struct {
	Queue q1;
	Queue q2;
} MyStack;

//typedef struct MyQueue
//{
//	int* a;
//	int top;
//	int capacity;
//}MyQueue;
 typedef struct MyQueue
{
	int* a;
	int front;
	int rear;
	int capacity;
}MyQueue;
// typedef struct PtrQueue
// {
//     MyQueue front;
//     MyQueue rear;
// }PtrQueue;
typedef struct {
	int* a;
	int front;
	int rear;
	int capacity;
} MyCircularQueue;

void QueueInit(Queue* q);
void QueuePush(Queue* q,QDataType x);
void QueuePop(Queue* q);
QDataType QueueFront(Queue* q);
QDataType QueueBack(Queue* q);
int QueueSize(Queue* q);
int QueueEmpty(Queue* q);
void QueueDestroy(Queue* q);

MyStack* myStackCreate();
void myStackPush(MyStack* obj, int x);
int myStackPop(MyStack* obj);
int myStackTop(MyStack* obj);
int myStackEmpty(MyStack* obj);
void myStackFree(MyStack* obj);

MyCircularQueue* myCircularQueueCreate(int k);
int myCircularQueueEnQueue(MyCircularQueue* obj, int value);
int myCircularQueueDeQueue(MyCircularQueue* obj);
int myCircularQueueFront(MyCircularQueue* obj);
int myCircularQueueRear(MyCircularQueue* obj);;
int myCircularQueueIsEmpty(MyCircularQueue* obj);
int myCircularQueueIsFull(MyCircularQueue* obj);
void myCircularQueueFree(MyCircularQueue* obj);
